#pragma once

#include <cstdint>
#include <entt/entt.hpp>
#include <string>
#include "ly/export.hpp"
#include "ly/types.hpp"
#include "ly/variant.hpp"

namespace ly {

class LY_API Properties {
 public:
  typedef std::multimap<property_names_id_type, Variant> properties_set;
  typedef std::pair<property_names_id_type, Variant> name_value_pair;
  typedef std::vector<properties_id_type> properties_id_vector;

  Properties(/* args */);
  ~Properties();

  property_names_id_type prop_name_id(const Variant& name);

  properties_id_type properties_id(const properties_set& props);

 private:
  // 通过属性名称ID查找属性名称的映射表
  // 用于根据ID快速获取对应的属性名称（字符串或其他类型）
  std::map<property_names_id_type, Variant> m_propnames_by_id;

  // 通过属性名称查找属性名称ID的映射表
  // 用于根据属性名称快速查找或分配唯一的ID
  std::map<Variant, property_names_id_type> m_propname_ids_by_name;

  // 通过属性集合ID查找具体属性集合的映射表
  // 用于根据ID获取完整的属性集合（包含多个名称-值对）
  std::map<properties_id_type, properties_set> m_properties_by_id;

  // 通过属性集合查找属性集合ID的映射表
  // 用于避免重复存储相同的属性集合，相同内容的集合共享同一个ID
  std::map<properties_set, properties_id_type> m_properties_ids_by_set;

  // 通过属性名称-值对查找包含该对的所有属性集合ID的映射表
  // 用于快速查找包含特定属性名称和值的所有属性集合，提高查询效率
  std::map<name_value_pair, properties_id_vector> m_properties_component_table;

  // 指向布局状态模型的指针
  // 用于跟踪布局状态变化，当属性仓库发生变化时通知状态模型以支持撤销/重做功能
  // db::LayoutStateModel* mp_state_model;
};

class ObjectWithProperties {
 public:
  ObjectWithProperties() {}
  ObjectWithProperties(properties_id_type id) : m_id(id) {}
  ~ObjectWithProperties() {};

  properties_id_type id() { return m_id; }
  void id(properties_id_type v) { m_id = v; }

 private:
  properties_id_type m_id;
};

}  // namespace ly
